home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / shlex.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  8KB  |  231 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''A lexical analyzer class for simple shell-like syntaxes.'''
  5. import os.path as os
  6. import sys
  7. from collections import deque
  8.  
  9. try:
  10.     from cStringIO import StringIO
  11. except ImportError:
  12.     from StringIO import StringIO
  13.  
  14. __all__ = [
  15.     'shlex',
  16.     'split']
  17.  
  18. class shlex:
  19.     '''A lexical analyzer class for simple shell-like syntaxes.'''
  20.     
  21.     def __init__(self, instream = None, infile = None, posix = False):
  22.         if isinstance(instream, basestring):
  23.             instream = StringIO(instream)
  24.         
  25.         if instream is not None:
  26.             self.instream = instream
  27.             self.infile = infile
  28.         else:
  29.             self.instream = sys.stdin
  30.             self.infile = None
  31.         self.posix = posix
  32.         if posix:
  33.             self.eof = None
  34.         else:
  35.             self.eof = ''
  36.         self.commenters = '#'
  37.         self.wordchars = 'abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
  38.         if self.posix:
  39.             self.wordchars += '\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde'
  40.         
  41.         self.whitespace = ' \t\r\n'
  42.         self.whitespace_split = False
  43.         self.quotes = '\'"'
  44.         self.escape = '\\'
  45.         self.escapedquotes = '"'
  46.         self.state = ' '
  47.         self.pushback = deque()
  48.         self.lineno = 1
  49.         self.debug = 0
  50.         self.token = ''
  51.         self.filestack = deque()
  52.         self.source = None
  53.         if self.debug:
  54.             print 'shlex: reading from %s, line %d' % (self.instream, self.lineno)
  55.         
  56.  
  57.     
  58.     def push_token(self, tok):
  59.         '''Push a token onto the stack popped by the get_token method'''
  60.         if self.debug >= 1:
  61.             print 'shlex: pushing token ' + repr(tok)
  62.         
  63.         self.pushback.appendleft(tok)
  64.  
  65.     
  66.     def push_source(self, newstream, newfile = None):
  67.         """Push an input source onto the lexer's input source stack."""
  68.         if isinstance(newstream, basestring):
  69.             newstream = StringIO(newstream)
  70.         
  71.         self.filestack.appendleft((self.infile, self.instream, self.lineno))
  72.         self.infile = newfile
  73.         self.instream = newstream
  74.         self.lineno = 1
  75.         if self.debug:
  76.             if newfile is not None:
  77.                 print 'shlex: pushing to file %s' % (self.infile,)
  78.             else:
  79.                 print 'shlex: pushing to stream %s' % (self.instream,)
  80.         
  81.  
  82.     
  83.     def pop_source(self):
  84.         '''Pop the input source stack.'''
  85.         self.instream.close()
  86.         (self.infile, self.instream, self.lineno) = self.filestack.popleft()
  87.         if self.debug:
  88.             print 'shlex: popping to %s, line %d' % (self.instream, self.lineno)
  89.         
  90.         self.state = ' '
  91.  
  92.     
  93.     def get_token(self):
  94.         """Get a token from the input stream (or from stack if it's nonempty)"""
  95.         if self.pushback:
  96.             tok = self.pushback.popleft()
  97.             if self.debug >= 1:
  98.                 print 'shlex: popping token ' + repr(tok)
  99.             
  100.             return tok
  101.         
  102.         raw = self.read_token()
  103.         if self.source is not None:
  104.             while raw == self.source:
  105.                 spec = self.sourcehook(self.read_token())
  106.                 if spec:
  107.                     (newfile, newstream) = spec
  108.                     self.push_source(newstream, newfile)
  109.                 
  110.                 raw = self.get_token()
  111.         
  112.         while raw == self.eof:
  113.             if not self.filestack:
  114.                 return self.eof
  115.                 continue
  116.             self.pop_source()
  117.             raw = self.get_token()
  118.         if self.debug >= 1:
  119.             if raw != self.eof:
  120.                 print 'shlex: token=' + repr(raw)
  121.             else:
  122.                 print 'shlex: token=EOF'
  123.         
  124.         return raw
  125.  
  126.     
  127.     def read_token(self):
  128.         quoted = False
  129.         escapedstate = ' '
  130.         while True:
  131.             nextchar = self.instream.read(1)
  132.             if nextchar == '\n':
  133.                 self.lineno = self.lineno + 1
  134.             
  135.             if self.debug >= 3:
  136.                 print 'shlex: in state', repr(self.state), 'I see character:', repr(nextchar)
  137.             
  138.             None if self.state is None else nextchar in self.escape
  139.             if self.state in self.quotes:
  140.                 quoted = True
  141.                 if not nextchar:
  142.                     if self.debug >= 2:
  143.                         print 'shlex: I see EOF in quotes state'
  144.                     
  145.                     raise ValueError, 'No closing quotation'
  146.                 
  147.                 if nextchar == self.state:
  148.                     if not self.posix:
  149.                         self.token = self.token + nextchar
  150.                         self.state = ' '
  151.                         break
  152.                     else:
  153.                         self.state = 'a'
  154.                 elif self.posix and nextchar in self.escape and self.state in self.escapedquotes:
  155.                     escapedstate = self.state
  156.                     self.state = nextchar
  157.                 else:
  158.                     self.token = self.token + nextchar
  159.             self.state in self.escapedquotes
  160.             None if self.state in self.escape else self.whitespace_split
  161.         result = self.token
  162.         self.token = ''
  163.         if self.posix and not quoted and result == '':
  164.             result = None
  165.         
  166.         if self.debug > 1:
  167.             if result:
  168.                 print 'shlex: raw token=' + repr(result)
  169.             else:
  170.                 print 'shlex: raw token=EOF'
  171.         
  172.         return result
  173.  
  174.     
  175.     def sourcehook(self, newfile):
  176.         '''Hook called on a filename to be sourced.'''
  177.         if newfile[0] == '"':
  178.             newfile = newfile[1:-1]
  179.         
  180.         if isinstance(self.infile, basestring) and not os.path.isabs(newfile):
  181.             newfile = os.path.join(os.path.dirname(self.infile), newfile)
  182.         
  183.         return (newfile, open(newfile, 'r'))
  184.  
  185.     
  186.     def error_leader(self, infile = None, lineno = None):
  187.         '''Emit a C-compiler-like, Emacs-friendly error-message leader.'''
  188.         if infile is None:
  189.             infile = self.infile
  190.         
  191.         if lineno is None:
  192.             lineno = self.lineno
  193.         
  194.         return '"%s", line %d: ' % (infile, lineno)
  195.  
  196.     
  197.     def __iter__(self):
  198.         return self
  199.  
  200.     
  201.     def next(self):
  202.         token = self.get_token()
  203.         if token == self.eof:
  204.             raise StopIteration
  205.         
  206.         return token
  207.  
  208.  
  209.  
  210. def split(s, comments = False):
  211.     lex = shlex(s, posix = True)
  212.     lex.whitespace_split = True
  213.     if not comments:
  214.         lex.commenters = ''
  215.     
  216.     return list(lex)
  217.  
  218. if __name__ == '__main__':
  219.     if len(sys.argv) == 1:
  220.         lexer = shlex()
  221.     else:
  222.         file = sys.argv[1]
  223.         lexer = shlex(open(file), file)
  224.     while None:
  225.         tt = lexer.get_token()
  226.         if tt:
  227.             print 'Token: ' + repr(tt)
  228.             continue
  229.         break
  230.  
  231.